import os
import re
import json

class PromptEngineering():
    def format(self, template: str, **kwargs: dict) -> str:
        """
        使用kwargs中的对应值替换模板中的占位符。

        :param template: 包含占位符的字符串，格式为<<key>>。
        :param kwargs: 字典，键对应模板中的占位符。
        :return: 用对应值替换占位符后的格式化字符串。
        """
        prompt = template
        for key, value in kwargs.items():
            prompt = prompt.replace(f"<<{key}>>", str(value))
        return prompt

    def parse_to_json(self, response: str) -> dict:
        """
        从字符串中提取并解析JSON对象。

        :param response: 包含JSON对象的字符串。
        :return: 从JSON对象解析出的字典，如果解析失败则返回None。
        """
        try:
            json_str = re.findall(r"([\{\[][\s\S]*[\}\]])", response)[-1]
            final_object = json.loads(json_str)
            return final_object
        except Exception as e:
            print("Error parsing JSON:", e)
            print("Response:", response)
            return None

    def json_to_markdown(self, json_object: dict, level: int = 1) -> str:
        """
        将JSON对象转换为Markdown格式的字符串。

        :param json_object: 表示JSON对象的字典。
        :param level: 当前递归的层级，用于确定Markdown标题的级别。
        :return: Markdown格式的字符串。
        """
        markdown = ""
        header_prefix = "#" * level  # 根据层级确定标题前缀

        for key, value in json_object.items():
            markdown += f"{header_prefix} {key}\n"
            if isinstance(value, dict):
                markdown += self.json_to_markdown(value, level + 1)
            elif isinstance(value, list):
                for item in value:
                    if isinstance(item, dict):
                        markdown += self.json_to_markdown(item, level + 1)
                    else:
                        markdown += f"- {item}\n"
            else:
                markdown += f"{value}\n"

        return markdown


    def get_template(self, filepath: str) -> str:
        """
        读取并返回文件内容。

        :param filepath: 文件路径。
        :return: 文件内容的字符串。
        """
        with open(filepath, "r", encoding="utf-8") as f:
            return f.read()

    def get_json(self, filepath: str) -> dict:
        """
        读取并解析JSON文件。

        :param filepath: JSON文件路径。
        :return: 从JSON文件解析出的字典。
        """
        with open(filepath, "r", encoding="utf-8") as f:
            return json.load(f)

    def write_json(self, data: dict, filepath: str):
        """
        将字典写入文件，格式为JSON。

        :param data: 要写入文件的字典。
        :param filepath: 文件路径。
        """
        with open(filepath, "w", encoding="utf-8") as f:
            json.dump(data, f, ensure_ascii=False, indent=4)
    
    def print_json(self, data: dict):
        """
        打印字典。

        :param data: 要打印的字典。
        """
        print(self.as_json(data))
    
    def as_json(self, data: dict) -> str:
        """
        将字典转换为JSON字符串。

        :param data: 要转换的字典。
        :return: JSON字符串。
        """
        return json.dumps(data, ensure_ascii=False, indent=4)

# if __name__ == "__main__":
#     pe = PromptEngineering()
#     template = "The <<animal>> is <<color>>."
#     d = {"animal": "cat", "color": "black"}
#     formatted_prompt = pe.format(template, **d)
#     print(formatted_prompt)  # "The cat is black."
